package com.levi.juc.volatiletest;

import javax.lang.model.element.VariableElement;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * volatile不保证原子性
 *  理论上num执行完之后是20000，但是不是2w，
 *  用javap -c编译成汇编指令之后可以看到num++，在底层上不是一行代码执行的
 *     因为num++，在底层上不是一行代码执行的，所以不保证原子性
 *     先获取 num的值，然后+1，再把+1后的值赋给num,一共三步操作
 *  要保证原子性就要使用原子类
 */
public class VolatileTest02 {
    private static volatile int num = 0;
    private static AtomicInteger atomicInteger = new AtomicInteger();
    public static void main(String[] args) {
        for (int i = 1; i <= 200; i++) {
            new Thread(()->{
                for (int j = 1; j <= 100; j++) {
                    increment();
//                    num++;
                }
            }).start();
        }
        while (Thread.activeCount() > 2) {  // main   gc  这两个线程,让主线程礼让
            Thread.yield();
        }

        System.out.println(atomicInteger);
//        System.out.println(num);
    }

    public static void increment() {
        atomicInteger.incrementAndGet();
    }
}
